#include <iostream>
#include <thread>
#include <future>
#include <memory>
//packaged_task的使用
//packaged_task是一个模版类，实例化的对象可以对一个函数进行二次封装
//packaged_task可以通过get_future获取一个future对象，来获取封装的这个函数的异步执行结果

int Add(int num1, int num2)
{
    std::cout << std::this_thread::get_id() << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return num1 + num2;
}

// 启动任务时：立即返回 future 对象，不阻塞当前线程。
// 获取结果时：通过 future.get() 阻塞直到结果就绪（或检查状态）
int main()
{   
    std::cout << std::this_thread::get_id() << std::endl;

    auto ptask = std::make_shared<std::packaged_task<int(int, int)>>(Add);
    std::future<int> fu = ptask->get_future();
    std::thread th([ptask](){
        (*ptask)(11, 22);
    });

    int sum = fu.get();
    std::cout << sum << std::endl;
    th.join();
    return 0;
}